# 编写jwt多条件校验
# backends模块包含了认证后端的实现。认证后端是Django用于验证用户凭据（如用户名和密码）的机制。
# ModelBackend是Django默认提供的认证后端之一。它使用Django的用户模型（默认是auth.User，但也可以是自定义的用户模型）来验证用户提供的用户名和密码
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from users.models import UserModel


def get_user(account):
    user = UserModel.objects.filter(Q(username=account) | Q(mobile=account)).first()
    return user


class CustomJwtModelBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        if username is None:
            # USERNAME_FIELD 是AbstractUser的类属性，默认为username
            # 使用UserModel.USERNAME_FIELD而不是硬编码的字段名（如'username'）的好处是，它允许你的代码在更改用户模型的用户名字段时保持兼容性
            username = kwargs.get(UserModel.USERNAME_FIELD)
        # 如果用户名或密码为空，直接返回None，表示认证失败
        if username is None or password is None:
            return

        user = get_user(username)
        # 如果用户存在且密码正确，且用户可以被认证，则返回用户对象
        if user.check_password(password) and user and self.user_can_authenticate(user):
            return user
